其他
粉丝关系链,10亿数据,如何设计?
用户A关注用户B,不需要用户B同意,此时用户A与用户B为弱好友关系,对A而言,暂且理解为“关注”; 用户B关注用户A,也不需要用户A同意,此时用户A与用户B也为弱好友关系,对A而言,暂且理解为“粉丝”;
用户A请求添加用户B为好友,用户B同意,此时用户A与用户B则互为强好友关系,即A是B的好友,B也是A的好友;
一个用户可以添加多个好友
也可以被多个好友添加
friend-service:好友中心服务,对调用者提供友好的RPC接口 db:对好友数据进行存储
guanzhu(uid, guanzhu_uid); fensi(uid, fensi_uid);
guanzhu表,用户记录uid所有关注用户guanzhu_uid fensi表,用来记录uid所有粉丝用户fensi_uid
guanzhu表要插入{1, 2}这一条记录,1关注了2 fensi表要插入{2, 1}这一条记录,2粉了1
select * from guanzhu where uid=1;
select * from fensi where uid=2;
强好友关系,存储层应该如何实现?
friend(uid1, uid2);
uid1,强好友关系中一方的uid uid2,强好友关系中另一方的uid
select * from friend where uid1=2
union
select * from friend where uid2=2
guanzhu(uid, guanzhu_uid); fensi(uid, fensi_uid);
guanzhu表要插入{1, 2}这一条记录 fensi表要插入{2, 1}这一条记录
guanzhu表要插入{2, 1}这一条记录 fensi表要插入{1, 2}这一条记录
friend(uid1, uid2)表 数据冗余guanzhu表与fensi表(后文称正表T1与反表T2)
friend表,数据量大时,如果使用uid1来分库,那么uid2上的查询就需要遍历多库 正表T1与反表T2通过数据冗余来实现好友关系,{1,2}{2,1}分别存在于两表中,故两个表都使用uid来分库,均只需要进行一次查询,就能找到对应的关注与粉丝,而不需要多个库扫描
业务方调用服务,新增数据 服务先插入T1数据 服务再插入T2数据 服务返回业务方新增数据成功
不复杂,服务层由单次写,变两次写 数据一致性相对较高(因为双写成功才返回)
请求的处理时间增加(要插入次,时间加倍) 数据仍可能不一致,例如第二步写入T1完成后服务重启,则数据不会写入T2
业务方调用服务,新增数据 服务先插入T1数据 服务向消息总线发送一个异步消息(发出即可,不用等返回,通常很快就能完成) 服务返回业务方新增数据成功 消息总线将消息投递给数据同步中心 数据同步中心插入T2数据
请求处理时间短(只插入1次)
系统的复杂性增加了,多引入了一个组件(消息总线)和一个服务(专用的数据复制服务) 因为返回业务线数据插入成功时,数据还不一定插入到T2中,因此数据有一个不一致时间窗口(这个窗口很短,最终是一致的) 在消息总线丢失消息时,冗余表数据会不一致
业务方调用服务,新增数据 服务先插入T1数据 服务返回业务方新增数据成功 数据会被写入到数据库的log中 线下服务或者任务读取数据库的log 线下服务或者任务插入T2数据
数据双写与业务完全解耦 请求处理时间短(只插入1次)
返回业务线数据插入成功时,数据还不一定插入到T2中,因此数据有一个不一致时间窗口(这个窗口很短,最终是一致的) 数据的一致性依赖于线下服务或者任务的可靠性
比较简单,开发代价小 线上服务无需修改,修复工具与线上服务解耦
扫描效率低,会扫描大量的“已经能够保证一致”的数据 由于扫描的数据量大,扫描一轮的时间比较长,即数据如果不一致,不一致的时间窗口比较长
写入正表T1 第一步成功后,写入日志log1 写入反表T2 第二步成功后,写入日志log2
虽比方法一复杂,但仍然是比较简单的 数据扫描效率高,只扫描增量数据
线上服务略有修改(代价不高,多写了2条日志) 虽然比方法一更实时,但时效性还是不高,不一致窗口取决于扫描的周期
写入正表T1 第一步成功后,发送消息msg1 写入反表T2 第二步成功后,发送消息msg2
效率高 实时性高
方案比较复杂,上线引入了消息总线这个组件 线下多了一个订阅总线的检测服务
关系链业务是一个典型的多对多关系,又分为强好友与弱好友 数据冗余是一个常见的多对多业务数据水平切分实践 冗余数据的常见方案有三种 (1)服务同步冗余 (2)服务异步冗余 (3)线下异步冗余 数据冗余会带来一致性问题,高吞吐互联网业务,要想完全保证事务一致性很难,常见的实践是最终一致性 最终一致性的常见实践是,尽快找到不一致,并修复数据,常见方案有三种 (1)线下全量扫描法 (2)线下增量扫描法 (3)线上实时检测法
欢迎大家继续提问,有问必答。